## 存储过程

#### 简单理解：就是将sql语句分装成一个函数（方法）

#### 创建存储过程格式

~~~ mysql
delimiter $$				# 设置$$为语句结尾标识
create procedure proc01()	 # 创建存储过程，并命名
begin
	select * from student;	 # 要执行的sql语句
end $$					    # $$ 到这表示语句结尾
delimiter ;					# 将语句结尾标识设回 ;

# 调用存储过程
call proc01()
~~~

#### 存储过程的传参（预习笔记）

#### in ：表示传入的参数

只有一个参数

~~~ mysql
delimiter $$
create procedure proc04(in name varchar(5))			# in 表示传入参数
begin
	select * from student where student.name = name; # 将传递的参数赋值并利用
end $$
delimiter ;

call proc04("张三");	# 传递参数，执行语句，得到张三的所有信息
call proc04("李四");	# 传递参数，执行语句，得到李四的所有信息
~~~

有多个参数

~~~ mysql
# 需求：查询指定部门，大于多少薪资的员工信息 （两个参数但是可变的）
delimiter $$
create procedure proc05(in param_dname varchar(10),in param_sal decimal(7,2))
begin
	select * from dept d,emp e where d.dname = param_dname and e.sal > param_sal;
end $$
delimiter ;

call proc05("学工部",20000);	# 调用分装好的语句，查询学工部薪资大于20000的员工信息
call proc05("销售部",10000);
~~~

#### out ：表示从存储过程内部传值给调用者

一个out参数

~~~ mysql
# 需求：传入员工编号，返回员工姓名
delimiter $$
create procedure proc06(in in_empno int, out out_ename varchar(5))
begin
	select ename into out_ename from emp where empno = in_empno; #into 表示将查询的结果赋值给out_ename
end $$
delimiter ;

call proc06(1001,@o_ename);		# 传入员工编号，定义一个变量接收返回的结果
select @o_ename;	# 查询变量值
~~~

多个out参数

~~~ mysql
# 需求：传入员工编号，返回员工姓名、薪资
delimiter $$ 
create procedure proc07(in in_empno int, out out_ename varchar(5), out out_sal decimal(7,2))
begin
	select ename,sal into out_ename,out_sal from emp where empno = in_empno; # 赋值字段一一对应，字段之间逗号隔开
end $$
delimiter ;

call proc07(1001,@o_ename,@o_sal);	# 定义变量接收返回结果
select @o_ename;
select @o_sal;
~~~

#### inout：表示从外部传入的参数进过修改后可以返回的变量，既可以使用传入变量的值，也可以修改传入变量的值

案例一

~~~ mysql
# 需求：传入一个数字，传出这个数字的10倍值
delimiter $$
create procedure proc08(inout num int)
begin
	set num = num * 10;
end $$
delimiter ;

set @inout_num = 2;		# 设一个变量用来接收变化的值，并给初始值
call proc08(@inout_num); # 调用存储过程，并将值传入
select @inout_num;		# 得到改变的值	20
~~~

案例二

~~~ mysql
# 需求：传入员工名，拼接部门号，传入薪资，求出年薪
# 拼接要求：	30_张三
delimiter $$
create procedure proc08(inout inout_ename varchar(5),inout inout_sal int)
begin
	# concat_ws	是一个拼接的函数，可以指定拼接格式
	select concat_ws('_',deptno,ename) into inout_ename from emp where emp.ename = inout_ename;
	set inout_sal = inout_sal * 12;
end $$
delimiter ;
# 定义变量，并赋初始值
set @inout_ename = "张三";
set @inout_sal = 3000;
# 调用存储过程，得到结果
call proc08(@inout_ename,@inout_sal);
# 打印结果
select @inout_ename;
select @inout_sal;
~~~